package org.jsola.hr.service;

import org.jsola.approval.vo.UserApproVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ICostBillDAO;
import org.jsola.hr.dto.CostBillAddDTO;
import org.jsola.hr.dto.CostBillApproveDTO;
import org.jsola.hr.dto.CostBillConfirmDTO;
import org.jsola.hr.dto.CostBillUpdateDTO;
import org.jsola.hr.entity.CostBillDO;
import org.jsola.hr.query.CostBillQuery;
import org.jsola.hr.vo.*;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 费用账单
 *
 * @author zhr
 */
public interface ICostBillService extends IService<ICostBillDAO, CostBillDO> {

    /**
     * 新增费用账单
     *
     * @param costBillAddDTO 新增费用账单DTO
     * @param tokenUser      当前用户
     * @return 费用账单详情信息
     */
    CostBillVO save(CostBillAddDTO costBillAddDTO, TokenUser tokenUser);

    /**
     * 修改费用账单
     *
     * @param costBillUpdateDTO 修改费用账单DTO
     * @param tokenUser         当前用户
     * @return 更新数量
     */
    int update(CostBillUpdateDTO costBillUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除费用账单，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser   当前用户
     * @param costBillIds 费用账单id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long... costBillIds);

    /**
     * 根据费用账单id查找
     *
     * @param costBillId 费用账单id
     * @param siteId     所属站点id
     * @return 费用账单详情信息
     */
    CostBillVO selectById(Long costBillId, String siteId);

    /**
     * 根据费用账单id查找
     *
     * @param costBillIdList 费用账单id
     * @param siteId         所属站点id
     * @return 费用账单详情信息
     */
    List<CostBillDO> selectByIds(List<Long> costBillIdList, String siteId);

    /**
     * 根据费用账单id查找,只能用于审批监听
     *
     * @param costBillId 费用账单id
     * @return 费用账单详情信息
     */
    CostBillDO selectById(Long costBillId);

    /**
     * 查询费用账单
     *
     * @param costBillQuery 查询条件
     * @param siteId        所属站点id
     * @return 费用账单列表信息
     */
    List<CostBillListVO> select(CostBillQuery costBillQuery, String siteId);

    /**
     * 查询费用账单记录数
     *
     * @param costBillQuery 查询条件
     * @param siteId        所属站点id
     * @return 费用账单记录数
     */
    int selectCount(CostBillQuery costBillQuery, String siteId);

    /**
     * 分页查询费用账单
     *
     * @param costBillQuery 查询条件
     * @param tokenUser     当前登录用户
     * @return 费用账单列表信息
     */
    Page<CostBillListVO> selectPage(CostBillQuery costBillQuery, TokenUser tokenUser);


    /**
     * 根据费用账单id查找
     *
     * @param costBillId 费用账单id
     * @param siteId     所属站点id
     * @return 费用账单
     */
    CostBillDO selectDOById(Long costBillId, String siteId);

    /**
     * 查询公司指定年月指定类型的费用账单
     *
     * @param year        年份
     * @param month       月份
     * @param companyId   公司id
     * @param subjectType 账单类型
     * @param siteId      所属站点id
     * @return 费用账单
     */
    CostBillDO selectByDateAndCompanyAndType(Integer year, Integer month, String companyId, String subjectType, String siteId);

    /**
     * 查询费用账单
     *
     * @param costBillQuery 查询条件
     * @param siteId        所属站点id
     * @return 费用账单列表
     */
    List<CostBillDO> selectDO(CostBillQuery costBillQuery, String siteId);

    /**
     * 生成费用账单
     *
     * @param costBillAddDTO 生成费用账单DTO
     * @param tokenUser      当前用户
     * @return 费用账单详情信息
     */
    List<CostBillVO> generatedBills(CostBillAddDTO costBillAddDTO, TokenUser tokenUser);

    /**
     * 根据账单Id查询账单详情
     *
     * @param id        账单Id
     * @param tokenUser 当前用户
     * @return 账单详情
     */
    CostBillInfoGroupVO selectCostBillInfoById(Long id, TokenUser tokenUser);

    /**
     * 导出账单
     *
     * @param id        账单Id
     * @param tokenUser 当前用户
     * @return excel路径
     */
    String exportCostBillInfoById(Long id, TokenUser tokenUser);

    /**
     * 生成费用账单(多用工单位)
     *
     * @param costBillAddDTO 新增费用账单参数
     * @param tokenUser      当前用户
     * @return 费用账单列表信息
     */
    CostBillVO generatedByCompanyIds(CostBillAddDTO costBillAddDTO, TokenUser tokenUser);

    /**
     * 检测某个参保月是否创建了账单
     *
     * @param subjectId 参保月Id
     * @param siteId    站点
     * @return 是否处于审批状态
     */
    Boolean checkMonthIdCreateCostBill(String subjectId, String siteId);

    /**
     * 发起审批
     *
     * @param costBillApproveDTO 发起审批新增参数
     * @param tokenUser          当前用户
     * @return 审批详情
     */
    UserApproVO launchApproveByCompanyId(CostBillApproveDTO costBillApproveDTO, TokenUser tokenUser);

    /**
     * 根据月工资表id查找
     *
     * @param monthSalaryId 月工资汇总表id
     * @param tokenUser     当前用户
     * @return 费用账单
     */
    CostBillDO selectByMonthSalaryId(Long monthSalaryId, TokenUser tokenUser);

    /**
     * 查询费用账单包含的用工单位
     *
     * @param costBillId 费用账单id
     * @param tokenUser  当前用户
     * @return 审批详情
     */
    List<CompanyVO> selectCompanyByCostBillId(Long costBillId, TokenUser tokenUser);

    /**
     * 根据审批Id查询账单详情
     *
     * @param userApprovalId 审批Id
     * @param tokenUser      当前用户
     * @return 账单详情
     */
    CostBillApprovalInfoVO selectCostBillInfoByUserApprovalId(String userApprovalId, TokenUser tokenUser);

    /**
     * 根据公司查询费用账单
     *
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 费用账单
     */
    List<CostBillDO> selectByCompanyId(String companyId, TokenUser tokenUser);

    /**
     * 根据subjectId模糊查询账单
     *
     * @param subjectId 业务类型Id
     * @param tokenUser 当前用户
     * @return 帐单列表
     */
    List<CostBillDO> selectCostBillBySubjectId(String subjectId, TokenUser tokenUser);

    /**
     * 确认账单
     *
     * @param costBillConfirmDTO 确认账单对象参数
     * @param tokenUser          当前用户
     * @return 成功数量
     */
    Integer confirmCostBill(CostBillConfirmDTO costBillConfirmDTO, TokenUser tokenUser);
}


